package edu.del.teamknowledgebase.service.auth;

import edu.del.teamknowledgebase.dto.LoginRequest;
import edu.del.teamknowledgebase.dto.RegisterRequest;
import edu.del.teamknowledgebase.vo.UserVO;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.multipart.MultipartFile;

/**
 * 认证服务接口
 */
public interface AuthService {

    /**
     * 用户登录
     *
     * @param loginRequest 登录请求参数
     * @param request HTTP 请求
     * @return 用户信息
     * @throws RuntimeException 登录失败时抛出异常
     */
    UserVO login(LoginRequest loginRequest, HttpServletRequest request);

    /**
     * 用户注册
     *
     * @param registerRequest 注册请求参数
     * @param request HTTP 请求
     * @return 用户信息
     * @throws RuntimeException 注册失败时抛出异常
     */
    UserVO register(RegisterRequest registerRequest, HttpServletRequest request);

    /**
     * 用户登出
     *
     * @param request HTTP 请求
     */
    void logout(HttpServletRequest request);

    /**
     * 获取当前登录用户信息
     *
     * @param request HTTP 请求
     * @return 用户信息
     * @throws RuntimeException 未登录或 Session 过期时抛出异常
     */
    UserVO getCurrentUser(HttpServletRequest request);

    /**
     * 检查用户是否已登录
     *
     * @param request HTTP 请求
     * @return 是否已登录
     */
    boolean isLoggedIn(HttpServletRequest request);

    /**
     * 获取用户敏感信息
     *
     * @param request HTTP 请求
     * @param password 密码
     * @return 用户敏感信息
     * @throws RuntimeException 密码错误时抛出异常
     */
    UserVO getSensitiveInfo(HttpServletRequest request, String password);

    /**
     * 上传用户头像
     *
     * @param file 头像文件
     * @param request HTTP 请求
     * @return 头像 URL
     */
    String uploadAvatar(MultipartFile file, HttpServletRequest request);

    /**
     * 更新用户名
     *
     * @param username 新用户名
     * @param request HTTP 请求
     * @return 更新后的用户信息
     */
    UserVO updateUsername(String username, HttpServletRequest request);

    /**
     * 重新绑定手机号
     *
     * @param newPhone 新手机号
     * @param code 验证码
     * @param request HTTP 请求
     * @return 重新绑定后的用户信息
     */
    UserVO rebindPhone(String newPhone, String code, HttpServletRequest request);

    /**
     * 重新绑定邮箱
     * @param newEmail 新邮箱
     * @param code 验证码
     * @param request HTTP 请求
     * @return 重新绑定后的用户信息
     */
    UserVO rebindEmail(String newEmail, String code, HttpServletRequest request);
}
